/**
 * 定义、整理 App 配置
 * 注意：所有配置内容都应从此处获取，其他地方不应自己读取 process.env 等内容
 */
import { parseQuery, truthy } from '@gnlab/utils'
import registerGlobal from '@gnlab/utils/env-browser/global'
import { useSCRMConfig } from '@/lib/scrm'

export const DEFAULT_PRODUCT_NAME = '企微集约化运营平台'

/**
 * 定义配置
 */
const config = {
  IN_DEVELOPMENT: false,
  APP_PROFILE: '',
  APP_VERSION: '',

  PRODUCT_NAME: DEFAULT_PRODUCT_NAME, // 产品名称（也会作为页面标题）
  PRODUCT_LOGO: null, // 产品 LOGO
  FAVICON_URL: null, // favicon
  FAVICON_UNREAD_URL: '/favicon-unread.png', // 有未读消息时的 favicon
  NO_HEADER: false, // 是否隐藏页面头部（有些客户是内嵌使用的，有自己的头部）

  MQTT_HOST: '', // 留空则使用网页域名
  MQTT_PORT: null as null | number, // 留空代表不指定，由 mqtt 模块自行判断
  MQTT_PATH: '',
  MQTT_QOS: 1,
  MQTT_SEND_PREFIX: 'quntool/rpc/',
  MQTT_RECV_PREFIX: 'quntool/wxw/',

  API: '/gnapi',

  // 访问资源文件（图片、视频）的 URL 前缀
  ASSET_PREFIX: '',

  // 底层最大支持发送多大的文件
  MAX_FILESIZE: 200,

  // apps       通过流量超市登录
  // internal   用 Quntool 自己的账号体系登录
  USABLE_AUTH_METHODS: ['internal'] as ('apps' | 'internal')[],

  // 是否使用外部登录页
  EXTERNAL_AUTH_PAGE: '',

  ACCOUNT_BASE_URL: '',//https://account.gnlab.com/auth
  APPS_ACCOUNT_API: '',//https://account.gnlab.com/api/
  APPS_API: '',//https://apps.gnlab.com/api/

  // 是否限制登录企微数量
  LIMIT_QYWX: false,

  // ai-chat 项目配置
  // - 跳网页通过 HTTP 协议跳过去，因为如果 QunTool 是 HTTP 的，如果跳 HTTPS 的 ai-chat 网页，那边的前端就无法访问 QunTool 接口了
  //   （而即使 QunTool 是 HTTPS 的，跳过去后 HTTP 的 ai-chat 前端访问 HTTPS 的 QunTool 接口是没问题的）
  // - 请求 ai-chat 接口则要使用 HTTPS 的，因为如果 QunTool 是 HTTPS 的，会无法请求 HTTP 的接口
  AI_CHAT_SITE: 'http://106.75.141.132', // ai-chat 网页 URL
  AI_CHAT_API: 'https://chatgpt.gnlab.com/api', // ai-chat 接口 URL
  QUNTOOL_API_FOR_AI_CHAT: '', // 传给 ai-chat 网页的 `QunTool 接口 URL`，未明确提供则使用 QunTool 自己在用的 API URL。不需要带 /gnapi。

  // 是否要检测 SCRM 部署状态，并提供跳转到 SCRM 的开关（不影响 SCRM 将 QunTool 内嵌使用）
  DETECT_SCRM: true,

  // 预先指定好 SCRM 网址和状态，若指定则不再实际执行检测，直接返回此结果（仅 DETECT_SCRM 为 true 时有效）
  SCRM_URL: null as string | null,
  SCRM_HAS_DOMAIN: false,

  // 是否开启客服模式：
  // - 不拉取企微列表
  // - 只显示转交进来的联系人
  // - 联系人只有“客户”这一种类型
  // - 不显示“查看账号信息”的链接
  SERVICE_MODE: false,

  // 客服模式对管理员是否生效。
  // false 的情况下，即使开启了 SERVICE_MODE，管理员进入时界面也是正常的。
  SERVICE_MODE_INCLUDE_ADMIN: false,
}
export type Config = typeof config

registerGlobal('config', config) // 导出到全局变量，便于调试
export default config

/**
 * 读取外部提供的 config（读取完毕后才能开始运行 App）
 *
 * 外部提供 conig 有两个途径:
 * 1. process.env.APP_CONFIG
 * 2. ./config/config.json
 *
 * 另外，在 SCRM 内运行时，还有一些针对 SCRM 环境的固定配置
 */
export async function loadExternalConfig() {
  /**
   * 从 env 中读取 config（这个一定有值）
   */
  const configFromEnv = process.env.APP_CONFIG as Partial<Config>
  Object.assign(config, configFromEnv)
  console.log('config from env', configFromEnv)

  /**
   * 尝试从 config.json 中读取 config（文件不一定存在）
   */
  try {
    const response = await fetch('./config/config.json?t=' + Date.now())
    if (response.status === 200) {
      const configFromFile = (await response.json()) as Partial<Config>
      Object.assign(config, configFromFile)
      console.log('config from file', configFromFile)
    } else if (response.status !== 404) {
      console.error('config.json 请求失败', response)
    }
  } catch (error) {
    console.error('加载 config.json 出错', error)
  }

  /**
   * 应用 SCRM 配置
   */
  if (useSCRMConfig) {
    const scrmConfig = {
      MQTT_HOST: '',
      MQTT_PORT: location.port,
      MQTT_PATH: '/mqtt/',
      AI_CHAT_DEFAULT_URL: '/ai-chat/',
    }
    Object.assign(config, scrmConfig)
    console.log('config for scrm', scrmConfig)
  }

  /**
   * 从 URL 参数中读取
   */
  const query = parseQuery(location.search)
  const updates: Partial<Config> = {}
  if (truthy(query.api)) updates.API = query.api
  if (['1', 'true'].includes(query['service-mode'] ?? '')) {
    updates.SERVICE_MODE = true
    updates.SERVICE_MODE_INCLUDE_ADMIN = true
  }
  Object.assign(config, updates)
  console.log('config for query', updates, query)
}
